#ifndef NANE_SCRIPTFUNCTOR_H
#   define  NANE_SCRIPTFUNCTOR_H

#   include "nane/ScriptSystem/IScriptSystem.h"
#   include "nane/ScriptSystem/ScriptSerializer.h"
#   include "nane/core/MemoryStream.h"
#   include <cassert>

namespace nane
{
//    class ScriptFunctor
//    {
//    public:
//        ScriptFunctor()
//            : m_module( NULL )
//            , m_object( NULL )
//        {
//        }
//
//        ScriptFunctor( IScriptModule* _module, IScriptObject* _object )
//            : m_module( _module )
//            , m_object( _object )
//        {
//
//        }
//
//        template<typename P1, typename P2, typename P3, typename P4>
//        void operator()( P1 _p1, P2 _p2, P3 _p3, P4 _p4 )
//        {
//            if( m_module != NULL )
//            {
//                ScriptParamsBuffer<P1, P2, P3, P4> args(m_module, _p1, _p2, _p3, _p4);
//                m_module->callObject(m_object, &args, NULL);
//            }
//        }
//
//        template<typename P1, typename P2, typename P3>
//        void operator()( P1 _p1, P2 _p2, P3 _p3 )
//        {
//            if( m_module != NULL )
//            {
//                ScriptParamsBuffer<P1, P2, P3> args(m_module, _p1, _p2, _p3);
//                m_module->callObject(m_object, &args, NULL);
//            }
//        }
//
//        template<typename P1, typename P2>
//        void operator()( P1 _p1, P2 _p2 )
//        {
//            if( m_module != NULL )
//            {
//                ScriptParamsBuffer<P1, P2> args(m_module, _p1, _p2);
//                m_module->callObject(m_object, &args, NULL);
//            }
//        }
//
//        template<typename P1>
//        void operator()( P1 _p1 )
//        {
//            if( m_module != NULL )
//            {
//                ScriptParamsBuffer<P1> args(m_module, _p1);
//                m_module->callObject(m_object, &args, NULL);
//            }
//        }
//
//        void operator()()
//        {
//            if( m_module != NULL )
//            {
//                m_module->callObject(m_object, NULL, NULL);
//            }
//        }
//        
//        IScriptModule* getModule()
//        {
//            return m_module;
//        }
//        
//        IScriptObject* getObject()
//        {
//            return m_object;
//        }
//
//    private:
//        IScriptModule* m_module;
//        IScriptObject* m_object;
//    };
//
//    template<>
//    struct ScriptWrapT<ScriptFunctor>
//    {
//        static const EScriptValueType type()
//        {
//            return EScriptValueType::Object;
//        }
//        
//        inline static bool getValue( TScriptValue& _scriptValue, EScriptValueType _type, IScriptModule* _module, ScriptFunctor* _value )
//        { 
//            if( _type == EScriptValueType::Object )
//            {
//                *_value = ScriptFunctor(_module, _scriptValue.o);
//            }
//            else
//            {
//                // error
//                return false;
//            }
//            return true;
//        }
//        inline static void setValue( TScriptValue& _scriptValue, EScriptValueType _type, IScriptModule* _module, ScriptFunctor _value ) 
//        { 
//            if( _type == EScriptValueType::Object )
//            {
//                _scriptValue.o = _value.getObject();
//            }
//            else
//            {
//                // error
//            }
//        }
//    };

}   // namespace nane

#endif	// NANE_SCRIPTFUNCTOR_H
